package cn.sykj.car.service.impl;

import cn.sykj.car.dict.DeleteFlagEnum;
import cn.sykj.car.entity.CarCarNo;
import cn.sykj.car.entity.CarUserWallet;
import cn.sykj.car.entity.CarUsers;
import cn.sykj.car.exception.CommonException;
import cn.sykj.car.exception.ParameterInvalidException;
import cn.sykj.car.mapper.CarUsersMapper;
import cn.sykj.car.service.ICarCarNoService;
import cn.sykj.car.service.ICarUserWalletService;
import cn.sykj.car.service.ICarUsersService;
import cn.sykj.car.utils.BusinessUtils;
import cn.sykj.car.utils.DateUtils;
import cn.sykj.car.utils.MD5Utils;
import cn.sykj.car.utils.Utils;
import cn.sykj.car.vo.CarUsersVO;
import cn.sykj.car.vo.ResponseMessageVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 用户注册信息 服务实现类
 * </p>
 *
 * @author duanzis
 * @since 2021-06-28
 */
@Service
public class CarUsersServiceImpl extends ServiceImpl<CarUsersMapper, CarUsers> implements ICarUsersService {

    @Resource
    private ICarCarNoService iCarCarNoService;

    @Resource
    private ICarUserWalletService iCarUserWalletService;

    /**
     * 会员信息查询
     *
     * @param page
     * @param carUsersVO
     * @return
     * @throws Exception
     */
    @Override
    public IPage<CarUsersVO> pageCarUsers(IPage<CarUsersVO> page, CarUsersVO carUsersVO) {

        // 判断如果所有条件都为空，那么默认给出来最近一周的时间
        if (Utils.isEmpty(carUsersVO.getCarNo())
                && Utils.isEmpty(carUsersVO.getRealName())
                && Utils.isEmpty(carUsersVO.getCardType())
                && Utils.isEmpty(carUsersVO.getUserTel())) {
            carUsersVO.setStartTime(DateUtils.get7DayDateTime());
            carUsersVO.setEndTime(DateUtils.getCurDateTime());
        }
        List<CarUsersVO> list = baseMapper.listCarUsers(page, carUsersVO);

        for (int i = 1; i <= list.size(); i++) {
            CarUsersVO carUsersVO1 = list.get(i - 1);
            carUsersVO1.setXh(((page.getCurrent() - 1) * page.getSize() + i));
        }

        page.setRecords(list);
        return page;
    }

    /**
     * 导出会员信息
     *
     * @param carUsersVO
     * @return
     * @throws Exception
     */
    @Override
    public List<CarUsersVO> exportCarUsers(CarUsersVO carUsersVO) {
        List<CarUsersVO> carUsersList = baseMapper.listCarUsers(carUsersVO);

        for (int i = 0; i < carUsersList.size(); i++) {
            CarUsersVO carUsersVO1 = carUsersList.get(i);
            if (Utils.notEmpty(carUsersVO1) && Utils.notEmpty(carUsersVO1.getCarTypeName())) {
                // 会员卡类型：1-月卡  2-临时卡 3-储值卡
                if (carUsersVO1.getCardType().intValue() == 1) {
                    carUsersVO1.setCarTypeName("月卡");
                }
                if (carUsersVO1.getCardType().intValue() == 2) {
                    carUsersVO1.setCarTypeName("临时卡");
                }
                if (carUsersVO1.getCardType().intValue() == 3) {
                    carUsersVO1.setCarTypeName("储值卡");
                }
            }

            if (Utils.notEmpty(carUsersVO1) && Utils.notEmpty(carUsersVO1.getStatusName())) {
                // 钱包状态（会员卡状态）：1-在用  0-停用（退款）
                if (carUsersVO1.getStatus().intValue() == 1) {
                    carUsersVO1.setStatusName("在用");
                }
                if (carUsersVO1.getStatus().intValue() == 0) {
                    carUsersVO1.setStatusName("停用");
                }
            }
        }
        return carUsersList;
    }

    /**
     * 添加会员信息
     * 1、判断参数书否为空
     *   -- 如果传入的参数carUsersvo是否为空，则需要抛出异常。
     * 2、判断添加车牌号、充值卡的类型不能为空
     *   -- 如果传入参数caeUsersVO.getCarNo是空值抛出异常“填写的车牌号不能为空”，如果传入参数carUserVO.getCarCategory是空值抛出异常“填写的充值卡的类型不能为空”
     * 3、判断添加进来的用户名是否重复，重复抛异常。
     *   -- 如果传入参数carUserVO.getUserName不是空值，mybatic单边查询carUsers用户表，通过用户名查询。获取到用户表里所有用户，如果取到的用户个数大于0，则该抛出异常该用户名已存在
     * 4、生成会员用户密码MD5加密，同时生成会员编码生成（自动生成，建议2位年+2位月+2位日+2位时+2位分+2位秒+3位随机数）。
     *   -- 通过BusinessUtils方法，生成用户编码。
     *   -- 通过MD5Utils方法，生成用户密码，从新new carUsers表，将carUserVO.getUsereCode，carUserVO.getPassword，将生成的用户编码，和用户密码存入到（set）到重新new出来的对象中。
     * 5、注册日期，如果没有填写注册日期，以当前时间为注册日期，否则取填写的注册日期
     *   -- 如果传入参数carUsersVO.getRegDate是空值，将当的系统时间new Date(),存入到carUsers表中。如果这不是空值将传入的参数carUsersVO.getRegDate()存入到用户表中。
     * 6、判断车牌号是否存在，如果车牌号存在，并且存在的车主不是现在的车主，需要先修改车主。修改车主后从新生成用户id。之前车牌号清空存入修改后车主车牌号
     *      如果车牌号不存在，将输入车牌号存入。
     *   --（1）如果传入车牌号的参数不是空值，如果通过传入车牌号在carCarNo查询到用户id，获取到用户表里所有用户，如果取到的用户个数大于0，则该抛出异常该用户名已存在,请充值。
     *   如果没有查询到车牌号，重新new carCarNo表，将传入进来carUsersVO.getCarNo()参数、carUsersVO.getid、DelFlag默认为未删除存入到new carCarNo
     *   --（2）如果传入车牌号的参数不是空值，通过用户表获取到用户名，如果用户名与传入用户名参数不相符，抛出异常联系管理员，修改用户名，修改新的车主姓名后，已有的用户名id逻辑删除，
     *         根据 修改后的用户名和车牌号，添加到carUsersVO表中，从新生成用户id 。
     * 7、判断充值卡是否存在，根据用户id判断该充值卡是否存在，在有效期内可以直接充值，
     * （否则超过有效期钱包是停用状态，确认原因启用后进行充值）超出有效期的需要之前充值的余额清空，重新充值
     *   -- 如果传入参数carUsersVO.getCardCategory不是空值，
     *      通过用户userID，查询carUser表中，中户的状态是否是启用状态，如果是禁用状态抛出异常“该用户已被禁用，不能充值”
     *      通过carUsersWallet表中CardCategory，查询表configCarCategory表中卡片类型。
     *      通过carUsersWallet，查询钱包status是否是启用状态、用户userid，查询出当前时间小于充值卡有效时间期间。充值后再原有截止时间
     *      加上一年有效期，将新的截止时间存入到carUsersWallet中。如果是status启用状态，查询出当前时间大于之充值截止时间。该充值卡已过期。如果之前钱包余额，carUsersWallet、
     *      carUsersWalletLog余额、赠送、返现、积分其全部修改为0。调取充值方法进行充值。
     * 8、添加用户成功。
     * @param carUsersVO
     * @return
     * @throws Exception
     */
    @Override
    @Transactional
    public ResponseMessageVO addCarUsers(CarUsersVO carUsersVO) throws Exception {

        // 判断参数是否为空
        if (Utils.isEmpty(carUsersVO)) {
            throw new ParameterInvalidException();
        }

        // 判断车牌号不能为空
        if (Utils.isEmpty(carUsersVO.getCarNo())) {
            throw new CommonException(" ", "填写车牌号不能为空");
        }

        // 判断会员卡类型不能为空
        if(Utils.isEmpty(carUsersVO.getCardType())){
            throw new CommonException(" ","填写会员卡类型不能为空");
        }

        // 判断用户名是否重复
        if (Utils.notEmpty(carUsersVO.getUserName())) {
            QueryWrapper<CarUsers> o_carUsersVO = new QueryWrapper<>();
            o_carUsersVO.eq(CarUsers.USER_NAME, carUsersVO.getUserName());
            List<CarUsers> carUsersList = this.list(o_carUsersVO);
            if (carUsersList.size() > 0) {
                throw new CommonException("", "该用户名已存在");
            }
        }

        boolean ret = true;

        // 、生成会员编码
        // 会员卡编号：自动生成，建议2位年+2位月+2位日+2位时+2位分+2位秒+3位随机数
        String userCode= BusinessUtils.generatorUserCode();

        // 生成加密密码
        String password = MD5Utils.getStringMD5(carUsersVO.getUserName().concat(carUsersVO.getPassword()));
        CarUsers carUsers=new CarUsers();
        carUsers.setPassword(password);
        carUsers.setUserCode(userCode);

        // todo 现在无法获取store_id ，先空着

        // 如果注册时间为空，取系统当前时间；不为空，那就获取
        if(Utils.isEmpty(carUsersVO.getRegDate())){
            carUsers.setRegDate(new Date());
        }else {
            carUsers.setRegDate(carUsersVO.getRegDate());
        }

        // 判断输入的是车牌号是否存在，
        if(Utils.notEmpty(carUsersVO)  || Utils.notEmpty(carUsersVO.getCarNo())){

        }

        // 判断充值卡的类型是否存在
        if(Utils.notEmpty(carUsersVO.getId())){
        if(Utils.notEmpty(carUsersVO.getCardCategory())){
            QueryWrapper<CarUserWallet> carUserWalletQueryWrapper=new QueryWrapper();
            carUserWalletQueryWrapper.eq(CarUserWallet.STATUS,1);


//            carUserWallet.setStatus(1);
//            ret=ret && iCarUserWalletService.save(carUserWallet);
        }

        }
        ret = ret && this.save(carUsersVO);


        // 插入添加车牌号
        CarCarNo carCarNo=new CarCarNo();
        carCarNo.setCarNo(carUsersVO.getCarNo());
        carCarNo.setUserId(carUsersVO.getId());
        carUsersVO.setDelFlag(DeleteFlagEnum.FALSE.VALUE);
        ret &=  iCarCarNoService.save(carCarNo);

        if(!ret){
            throw new CommonException("","添加车牌号失败！请联系管理员");
        }
        // 充值金额、积分



        ResponseMessageVO responseMessageVO = new ResponseMessageVO();
        responseMessageVO.setRetType("添加会员信息");
        responseMessageVO.setRetFlag(ret);
        responseMessageVO.setRetMsg("添加会员信息，ID为：" + carUsersVO.getId() );
        return responseMessageVO;
    }
}
